<?php
/**
 * D17 网站文章发布系统
 */

//**** 初始化一些目录信息 ****//

    define('ROOT_PATH', dirname(__FILE__) . '/');
    define('LIB_PATH', ROOT_PATH . 'lib/');
	define('POST_URL_KEY_LIST',ROOT_PATH . 'postUrlKeyList/');//保存已发布的文章的链接和关键词的目录（标题）
	define('POST_KEY_LOG', ROOT_PATH . 'keyLog/');//保存已发布过的关键词的目录

//**** 引用类库信息 ****//
    require LIB_PATH  . 'lib.functions.php';  // 导入类库方法(公共)
    require LIB_PATH  . 'd17.Class.php';   // 导入功能方法(自用)
    require ROOT_PATH . 'config.php';         // 引入配置信息

    // 初始化发布列队
    $processList = array();

//**** 执行流程 ****//

    print_f("==第一枪发文章系统==\n启动时间: " . date('Y-m-d H:i:s') . "\n\n");
	
	//==========================================百度推送======================================
	// 主动将前一天发布的文章链接推送给百度		
	$day = "昨天";
	print_f("检查{$day}的连接并主动推送到百度...\n"); 
	foreach ($userList as $userName => $userInfo) {
		
		// 获取最近4页的所有连接 并推送到百度
		$date = date("Y-m-d",strtotime("-1 day"));
		$all_list = getPostUrlList($userName,$date);
		if (!$all_list) {print_f("获取{$day}的文章链接【失败】!!!\n");continue;}

		// 执行百度推送
		$ret = do_baiduPush($all_list,$userName,$day,$date);
		if ($ret) continue;
	}
	//==========================================百度推送======================================

    // 初始化登录每个账号
    print_f("共导入账号 " . count($userList) . " 个，登录中...\n");
     foreach ($userList as $userName => $userInfo) {
        print_f("登录账号 {$userName} ...");

        // 初始化创建对象
        $userList[$userName]['d17'] = new d17($userInfo['userName'], $userInfo['password']);

        // 检查初始是否成功
        if($userList[$userName]['d17']->getErrorMsg() == 'NotLogin'){
            if(!$userList[$userName]['d17']->userLogin()){
                // 登录失败
                print_f("登录失败: " . $userList[$userName]['d17']->getErrorMsg() . "\n");
                // 删除本对象
                unset($userList[$userName]);
            }else{
                $userList[$userName]['d17']->saveCookie();
                print_f("登录成功\n");
            }
        } else {
            print_f("登录成功(缓存)\n");
        }
     }
    print_f("共登录成功 " . count($userList) . " 个账号.\n\n");



    // 创建每个账号的文章发布列队
    print_f("生成发布文章列队...\n");
    foreach ($userList as $userName => $userInfo) {
        $time = rand($interTimeMin, $interTimeMax);
		$data = strtotime("+{$time} seconds");

        $processList[] = array('time' => $data, 'userName' => $userName);
        print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n");

        // 初始化一些其他数据
        $userList[$userName]["new"]['addPostNum'] = 1;
        $userList[$userName]["product"]['addPostNum'] = 1;
    }
    // 处理列队里面的数据
    print_f("\n开始处理列队...\n");
	
    while (count($processList) > 0) {
        print_f("[列队数量] " . count($processList) . "\n");

        // 对列队时间排序
        uasort($processList, function($a, $b){ return $a['time'] - $b['time']; });

        // 取出第一个成员
        $process  = array_shift($processList);
        $userName = $process['userName'];

        print_f("[处理列队] 下次任务时间: " . date('Y-m-d H:i:s', $process['time']) . " 当前时间: " . date('Y-m-d H:i:s') . " 执行账号: {$userName}\n");

        // 计算需要延迟多久
        if($process['time'] > time()){
            $sleep = $process['time'] - time();
            print_f("[列队等待] 还需等待 {$sleep}s\n");
            sleep($sleep);
        }

        //**** 发布文章流程 ****//
		$markName = $userList[$userName]['mark'];
		// 获取文章
		print_f("[文章标记] {$markName} , 获取文章...\n");
		// 获取标题关键词
		$keyListDir = dirname(__FILE__) . '/keylist/' . $userList[$userName]['hosType'].'/'.$userName.'.txt';
		$postKeyword = getFileKeyword($keyListDir);
		
		// 发布一篇文章
		$options = array(
			'titlePicPath' => getRandImg(dirname(__FILE__) . '/imglist/new/' . $userList[$userName]['hosType'].'/'.$userName.'.txt'),
			'productImage' => getRandImg(dirname(__FILE__) . '/imglist/product/' . $userList[$userName]['hosType'].'/'.$userName.'.txt')
 		);
		
		$addPostRetproduct = $userList[$userName]['d17']->postAddproduct($postKeyword["product"], $userList[$userName], $options);
		$addPostRetnew = $userList[$userName]['d17']->postAddnew($postKeyword["new"], $userList[$userName], $options);
		file_put_contents(dirname(__FILE__) . '/post.html', "{$postKeyword["product"]}<hr />{$postKeyword["new"]}<hr />");
		// 判断是否发布成功
		$isNextAdd = true;
		if($addPostRetnew){
			print_f("[发布成功] 账号: {$userName} 第 {$userList[$userName]["new"]['addPostNum']} 篇 <{$postKeyword["new"]}>\n");
			$userList[$userName]["new"]['addPostNum']++;
			
			//限定每个账号每天只能发10篇文章
			if ($userList[$userName]["new"]['addPostNum'] >10) $isNextAdd = false;
		} else {
			$errorMsg = $userList[$userName]['d17']->getErrorMsg();
			if($errorMsg == '操作频繁') $isNextAdd = false;
			print_f("[发布失败] 账号: {$userName} 错误原因: {$errorMsg}\n\n");
			//更新关键词附表的（ID）标识-1
			modityKeyId($keyListDir);
		}
		if($addPostRetproduct){
			print_f("[发布成功] 账号: {$userName} 第 {$userList[$userName]["product"]['addPostNum']} 篇 <{$postKeyword["product"]}>\n");
			$userList[$userName]["product"]['addPostNum']++;
				
			//限定每个账号每天只能发10篇文章
			if ($userList[$userName]["product"]['addPostNum'] > 10) $isNextAdd = false;
		} else {
			$errorMsg = $userList[$userName]['d17']->getErrorMsg();
				
			if($errorMsg == '操作频繁') $isNextAdd = false;
			print_f("[发布失败] 账号: {$userName} 错误原因: {$errorMsg}\n\n");
				
			//更新关键词附表的（ID）标识-1
			modityKeyId($keyListDir);
		}
		// 创建下次发布时间
		if($isNextAdd){
			$time = rand($interTimeMin, $interTimeMax);
			$data = strtotime("+{$time} seconds");

			$processList[] = array('time' => $data, 'userName' => $userName);
			print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n\n");
		}
		
		//停止当前账号的文章发布，并记录当天发布文章的所有链接及标题（关键词）
		else{
			echo "====导出今天发布的所有文章链接及标题===\n";
			$date = date("Y-m-d H:i:s",time());
			$D_flag1 = file_put_contents(POST_URL_KEY_LIST.$userName.".csv", $date."\n", FILE_APPEND);
			$D_flag2 = file_put_contents(POST_KEY_LOG.$userName."_key.csv", "\n".$date.",", FILE_APPEND);
			
	
				$postList = $userList[$userName]['d17']->getPostList(10);//获取已发布文章的链接
				if (!empty($postList['info'][0])){
					//保存已发布的文章的链接和关键词
					$retInfo = $userList[$userName]['d17']->savePostUrl_Title($userName,$postList,1);
					if ($retInfo === false) print_r("{$userName}··· 链接及标题未保存完整\n");
					else{
						print_r("{$userName}··· 链接及标题已保存至".POST_URL_KEY_LIST.$userName.".csv\n");
						//单独保存已发布的关键词
						$json_titleList = $retInfo;
						$ret = $userList[$userName]['d17']->saveKey($userName,$json_titleList);
						if ($ret) print_r("{$userName}··· 标题已保存至".POST_KEY_LOG.$userName."_key.csv\n");
						else print_r("{$userName}··· 标题保存失败\n");
					}
				}
				else print_r("${userName}··· 获取链接失败\n");
			
		}
    }
	
	
	// 主动将今天发布的文章链接推送给百度		
	$day = "今天";
	print_f("检查{$day}的连接并主动推送到百度...\n"); 
	foreach ($userList as $userName => $userInfo) {
		$date = date("Y-m-d");
		$all_list = getPostUrlList($userName,$date);
		if (!$all_list) {print_r("获取{$day}的文章链接【失败】!!!\n");continue;}

		// 执行百度推送
		$ret = do_baiduPush($all_list,$userName,$day,$date);
		if ($ret) continue;
	}

print_f("[结束]\n");
